<?php
/**
 * Plugin для проверки прав на доступ пользователя к запрашиваемому контроллеру и действию
 * 
 * см. http://codeutopia.net/blog/2009/02/06/zend_acl-part-1-misconceptions-and-simple-acls/
 * см. также Apress.Practical.Web.2.0.Applications.With.PHP
 * см. также http://blog.threadaffinity.com/2008/09/simple-application-with-zend_auth-and-zend_acl/
 * 
 * изменен и адаптирован мной для проекта систмы регистрации заявок
 * 
 * LICENSE: Free to use license
 * 
 * @copyright 	2009
 * @author 		Яковлев Иван Yak1980@list.ru | Best4u.mail@gmail.com
 * @version		$id:$
 * @link 
 * @since 
 */


//require_once ('Zend/Controller/Plugin/Abstract.php');

class Plugin_AccessControl extends Zend_Controller_Plugin_Abstract
{
	/**
	 * Контейнер для объект Zend_Acl с настроенным для нашего приложения списком контроля доступа
	 */
	private $_acl = null;
	
	/**
	 * Контейнер для объект Zend_Auth
	 */
	private $_auth = null;
	
	/**
	 * Контейнер для хранения необходимыx для идентификации зарегистрированного пользователя данные
	 */
	private $_identity = null;
	
	/**
	 * Роль присваиваемая незарегистрированному пользователю по умолчанию
	 */
	private $_defaultRole = 'guest';
	
	public function __construct()
	{
		$this->_acl = new System_Acl();
		
		$this->_auth = Zend_Auth::getInstance();
		$this->_identity = $this->_auth->getIdentity();
	}
	
	public function preDispatch(Zend_Controller_Request_Abstract $request)
	{
		// если пользователь авторизован, то ему присваивается соответствующая роль
		// иначе будет присвоена роль по умолчанию
		$role = ($this->_auth->hasIdentity() && isset($this->_identity->user_type))?
			$this->_identity->user_type	: $this->_defaultRole;
		
		// Если в списке Acl нет указанной роли, то пользователю присваивается роль по умолчанию
		if(!$this->_acl->hasRole($role)){
			$role = $this->_defaultRole;
		}
		
		// Получаем имя ресурса доступ к которому контролируется через список ACL
		//$resource = $request->getControllerName();
		$resource = $request->getModuleName();
		
		// Получаем имя привелегии равное имени запрашиваемого действия
		$privilege = $request->getActionName();
		
	    // Проверяем контролируется ли запрошенный ресурс через список Acl
		// Если да, то контролируем доступ к нему
		if ($this->_acl->has($resource)) {
    		// Если доступ к запрашиваемому ресурсу запрещен,
    		// то перенаправляем пользователя на страницу логина
    		if (!$this->_acl->isAllowed($role, $resource, $privilege)) {
    			// Сохраняем запрашиваемый пользователем ресурс (адрес куда он собирался попасть)
                // и передаем эти параметры в LoginController
                $request->setParam("_requestUri", $request->getRequestUri());
    		    
    		    $request->setModuleName('default');
    			$request->setControllerName('login');
    			$request->setActionName('index');
    		}
		}
	}

}